home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-12-04 | 6.0 KB | 226 lines | [TEXT/CWIE] |
- // C3DMFPane.cp
- //
- // A PowerPlant application for viewing QuickDraw3D Metafiles
- //
- // by James Jennings
- // Started November 12, 1995
- //
-
- #include "C3DMFViewerPane.h"
- #include "QD3D Debug Macros.h"
- #include <CodeFragments.h> // for Has3DViewer() code
-
- // Commands: From the Flags menu.
- const MessageT cmd_Q3ViewerDefault = 9940;
- const MessageT cmd_Q3ViewerBadge = 9900;
- const MessageT cmd_Q3ViewerActive = 9901;
- const MessageT cmd_Q3ViewerControllerVisible = 9902;
- const MessageT cmd_Q3ViewerDrawFrame = 9903;
- const MessageT cmd_Q3ViewerDraggingOff = 9904;
- const MessageT cmd_Q3ViewerCamera = 9905;
- const MessageT cmd_Q3ViewerTruck = 9906;
- const MessageT cmd_Q3ViewerOrbit = 9907;
- const MessageT cmd_Q3ViewerZoom = 9908;
- const MessageT cmd_Q3ViewerDolly = 9909;
-
- Boolean
- C3DMFViewerPane::Has3DViewer(void)
- {
- // Here are two ways of finding out if the Viewer shared library
- // is installed. Neither seems to work in early versions (1.0) of QD3D.
- #if 1
- long result;
- OSErr err = ::Gestalt(gestaltQD3DViewer, &result);
- return err==noErr && result == gestaltQD3DViewerAvailable;
- #else
- return ((Boolean)Q3ViewerNew != kUnresolvedCFragSymbolAddress);
- #endif
- }
-
- // ---------------------------------------------------------------------------
- // • CreateQ3ViewerPaneStream [static]
- // ---------------------------------------------------------------------------
- // Return a new C3DMFViewerPane object initialized using data from a Stream
-
- C3DMFViewerPane*
- C3DMFViewerPane::CreateQ3ViewerPaneStream(
- LStream *inStream)
- {
- return (new C3DMFViewerPane(inStream));
- }
-
- // ---------------------------------------------------------------------------
- // • C3DMFViewerPane [constructor]
- // ---------------------------------------------------------------------------
- //
-
- C3DMFViewerPane::C3DMFViewerPane(LStream *inStream)
- : LPane(inStream), mViewer(0)
- {
- CGrafPtr aPort = (CGrafPtr)GetMacPort();
- Rect r;
- if (CalcPortFrameRect(r) && Has3DViewer()) {
- ::InsetRect(&r,1,1); // shrink viewer to fit its frame into the pane
- mViewer = ::Q3ViewerNew(aPort, &r, kQ3ViewerDefault);
- ThrowIfQ3Any_();
- }
- ThrowIfNil_(mViewer);
- }
-
- // ---------------------------------------------------------------------------
- // • ~C3DMFViewerPane [destructor]
- // ---------------------------------------------------------------------------
- //
-
- C3DMFViewerPane::~C3DMFViewerPane(void)
- {
- OSErr anErr = ::Q3ViewerDispose(mViewer);
- mViewer = 0;
- }
-
- void C3DMFViewerPane::UseFile(Int16 refNum)
- {
- OSErr iErr;
- ThrowIfOSErr_( iErr = ::Q3ViewerUseFile(mViewer, refNum) );
- }
-
- void C3DMFViewerPane::AdjustCursorSelf(Point inPortPt, const EventRecord &inMacEvent)
- {
- Boolean changed = ::Q3ViewerAdjustCursor(mViewer, &inPortPt);
- }
-
- void
- C3DMFViewerPane::ClickSelf(
- const SMouseDownEvent& inMouseDown )
- { // pass a mouse down to the viewer
- FocusDraw(); // set up the drawing environment for mouse tracking.
- // (need to cast away the const)
- Boolean isViewerEvent = ::Q3ViewerEvent(mViewer, (EventRecord*)&inMouseDown.macEvent );
- }
-
- /*void
- C3DMFViewerPane::EventMouseUp(
- const EventRecord &inMouseUp)
- { // pass a mouse up to the viewer (apparently not needed)
- FocusDraw();
- // (need to cast away the const)
- if (!::Q3ViewerEvent(mViewer, (EventRecord*)&inMouseUp ))
- LPane::EventMouseUp(inMouseUp); // inherited: I don't know if this is necessary.
- }*/
-
- void
- C3DMFViewerPane::DrawSelf()
- {
- OSErr iErr = ::Q3ViewerDraw(mViewer);
- // ThrowIfOSErr_(iErr);
- }
-
- // MoveBy() and ResizeFrameBy() aren't needed in this app, and
- // therefore havn't been tested, but they round out the class.
-
- void
- C3DMFViewerPane::MoveBy(
- Int32 inHorizDelta,
- Int32 inVertDelta,
- Boolean inRefresh)
- { // move the location of the viewer.
- LPane::MoveBy(inHorizDelta, inVertDelta, inRefresh);
- FitViewerToPane();
- }
-
- void
- C3DMFViewerPane::ResizeFrameBy(
- Int16 inWidthDelta,
- Int16 inHeightDelta,
- Boolean inRefresh)
- { // change the size of the viewer
- LPane::ResizeFrameBy(inWidthDelta, inHeightDelta, inRefresh);
- FitViewerToPane();
- }
-
- void
- C3DMFViewerPane::FitViewerToPane(void)
- { // helper function: used in ResizeFrameBy() and MoveBy()
- Rect r;
- if (CalcPortFrameRect(r)) {
- ::InsetRect(&r,1,1); // shrink viewer to fit its frame into the pane
- ThrowIfOSErr_( ::Q3ViewerSetBounds(mViewer, &r) );
- }
- }
-
- Boolean
- C3DMFViewerPane::ObeyCommand(CommandT inCommand, void *ioParam)
- {
- Boolean cmdHandled = false;
- long flags = ::Q3ViewerGetFlags(mViewer);
- long oldFlags = flags;
-
- switch (inCommand) {
- case cmd_Q3ViewerDefault:
- flags = kQ3ViewerDefault;
- cmdHandled = true;
- break;
- case cmd_Q3ViewerBadge:
- case cmd_Q3ViewerActive:
- case cmd_Q3ViewerControllerVisible:
- case cmd_Q3ViewerDrawFrame:
- case cmd_Q3ViewerDraggingOff:
- case cmd_Q3ViewerCamera:
- case cmd_Q3ViewerTruck:
- case cmd_Q3ViewerOrbit:
- case cmd_Q3ViewerZoom:
- case cmd_Q3ViewerDolly:
- Int16 bit = inCommand - cmd_Q3ViewerBadge;
- flags ^= 1<<bit;
- cmdHandled = true;
- break;
-
- default:
- cmdHandled = LCommander::ObeyCommand(inCommand, ioParam);
- }
- if (flags != oldFlags)
- ThrowIfOSErr_(::Q3ViewerSetFlags(mViewer, flags));
-
- #if 1 // two ways of showing the changes
- Refresh(); // redraw on the next Update event
- #else
- ThrowIfOSErr_(::Q3ViewerDraw(mViewer)); // redraw now
- #endif
-
- return cmdHandled;
- }
-
- void
- C3DMFViewerPane::FindCommandStatus(CommandT inCommand,
- Boolean &outEnabled, Boolean &outUsesMark,
- Char16 &outMark, Str255 outName)
- {
- long flags = ::Q3ViewerGetFlags(mViewer);
- switch (inCommand) {
- case cmd_Q3ViewerDefault:
- outEnabled = true;
- outUsesMark = true;
- outMark = (flags == kQ3ViewerDefault)?checkMark:noMark;
- break;
- case cmd_Q3ViewerBadge:
- case cmd_Q3ViewerActive:
- case cmd_Q3ViewerControllerVisible:
- case cmd_Q3ViewerDrawFrame:
- case cmd_Q3ViewerDraggingOff:
- case cmd_Q3ViewerCamera:
- case cmd_Q3ViewerTruck:
- case cmd_Q3ViewerOrbit:
- case cmd_Q3ViewerZoom:
- case cmd_Q3ViewerDolly:
- Int16 bit = inCommand - cmd_Q3ViewerBadge;
- outEnabled = true;
- outUsesMark = true;
- outMark = (flags & (1<<bit))?checkMark:noMark;
- break;
-
- default:
- LCommander::FindCommandStatus(inCommand, outEnabled, outUsesMark, outMark, outName);
- }
- }
-
-